package com.acsior.hibernate.dao;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Restrictions;

import com.acsior.dac.exeption.DataAccessException;
import com.acsior.dac.impl.hibernate.HibernateSessionFactory;
import com.acsior.hibernate.vo.ReportingDailyFinancialVO;

/**
 * Разбира се и тук препираме на ръка. Този винаги трябва да се използва в
 * транзакция!!!
 * 
 * @author К. Кръстев <kk@acsior.com>
 */
public class ReportingDailyFinancialDAO {

	/** За търсенето по код на дневен отчет */
	private static final String CODE = "code";

	private Class<ReportingDailyFinancialVO> clazz;

	/**
	 * Достъп до кодовете за дневния отчет.
	 */
	public ReportingDailyFinancialDAO() {
		this.clazz = ReportingDailyFinancialVO.class;
	}

	/**
	 * Критерий за търсене по код.
	 * 
	 * @param code
	 * @return търсене по кода
	 */
	public Criteria createCriteria(int code) {
		HibernateSessionFactory hsf = HibernateSessionFactory.getInstance();
		Criteria res = hsf.getSession().createCriteria(this.clazz);
		res.add(Restrictions.eq(CODE, code));

		return res;
	}

	/**
	 * @param code
	 * @return да, ако има код в БД, <code>null</code> в противен случай
	 */
	public ReportingDailyFinancialVO hasRow(int code) {
		Criteria cr = createCriteria(code);
		return cr.list().size() > 0 ? (ReportingDailyFinancialVO) cr.list()
				.get(0) : null;
	}

	/**
	 * @param v
	 * @throws DataAccessException
	 *             при проблеми
	 */
	public void save(ReportingDailyFinancialVO v) throws DataAccessException {
		HibernateSessionFactory hsf = HibernateSessionFactory.getInstance();
		try {
			hsf.getSession().save(v);
		} catch (HibernateException he) {
			throw new DataAccessException(he);
		}
	}
}
